<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>NIO的核心实现那些事儿！</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="renderer" content="webkit"/>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.slim.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script>
</head>
<body>
<header class="container-fluid">
  <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="../index.html">
      <svg class="bi bi-x-diamond-fill text-info" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
        <path fill-rule="evenodd" d="M9.05.435c-.58-.58-1.52-.58-2.1 0L4.047 3.339 8 7.293l3.954-3.954L9.049.435zm3.61 3.611L8.708 8l3.954 3.954 2.904-2.905c.58-.58.58-1.519 0-2.098l-2.904-2.905zm-.706 8.615L8 8.707l-3.954 3.954 2.905 2.904c.58.58 1.519.58 2.098 0l2.905-2.904zm-8.615-.707L7.293 8 3.339 4.046.435 6.951c-.58.58-.58 1.519 0 2.098l2.904 2.905z"/>
      </svg>
	  我的博客
    </a>
   <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <div class="navbar-nav mr-auto">
        <a class="nav-item nav-link" 
           href="../hololive/index.html">二期生</a><a class="nav-item nav-link" 
           href="../nio/index.html">Nio三大核心</a><a class="nav-item nav-link" 
           href="../Study/index.html">今日复习MarkDown组件</a><a class="nav-item nav-link" 
           href="../JavaApi/index.html">nio包</a><a class="nav-item nav-link" 
           href="../Anime/index.html">青春校园类</a>
        
        
        
      </div>
    </div>

    <div class="" id="navbarSupportedContentUser">
      <div class="navbar-nav mr-auto" >
        <a class="nav-item nav-link" href="../../myweb/createQR.html">二维码生成</a>
        <a class="nav-item nav-link" href="../../myweb/showAllUser">用户列表</a>
        <a class="nav-item nav-link" href="../../myweb/reg.html">修改密码</a>
      </div>
    </div>
  </nav>
</header>

<div class="container-fluid text-center py-3 bg-dark">
    <h1 class="font-weight-normal text-center text-white ">我的博客</h1>
    <p class="font-weight-normal text-center text-white ">编程也可以很好玩</p>
</div>

<div class="container-fluid bg-light">
  <div class="row">
    <div class="col-8 col-offset-2">
      <div  class="container bg-white py-2 my-5 mb-3">
	    <!-- 标题区域 -->
        <h2 class="font-weight-normal text-center mb-1">NIO的核心实现那些事儿！</h2>
	    <!-- 元数据 -->
        <div class="col-12 text-center border-bottom mt-2">2020-6-24 王浩</div>
        <!--   文章内容    -->
        <div class="content"><h2>NIO的三个核心模块</h2>
<ol>
<li>Buff(缓冲区)</li>
<li>Channel(通道)</li>
<li>Selector(选择器)</li>
</ol>
<h2>缓冲区</h2>
<ol>
<li>
<p>基本概念：缓冲区(Buffer)就是在内存中预留指定字节数的存储空间用来对输入/输出(I/O)的数据作临时存储，这部分预留的内存空间就叫做缓冲区；</p>
</li>
<li>
<p>作用：用来临时存储数据，可以理解为是I/O操作中数据的中转站。缓冲区直接为通道(Channel)服务，写入数据到通道或从通道读取数据，这样的操利用缓冲区数据来传递就可以达到对数据高效处理的目的。</p>
</li>
<li>
<p>类型：Buffer就像一个数组，可以保存多个相同类型的数据，根据数据类型的不同（Boolean类型除外），有以下七个Buffer常用的子类：ByteBuffer、CharBuffer 、ShortBuffer 、IntBuffer 、LongBuffer 、FloatBuffer 、DoubleBuffer 。</p>
</li>
<li>
<h3>缓冲区的四个基本属性</h3>
</li>
</ol>
<p><img src="hcq.png" alt="" /></p>
<p>四个属性遵循以下的不变式：capacity=&gt;limit=&gt;position=&gt;mark=&gt;0</p>
<h3>创建缓冲区的注意事项</h3>
<ol>
<li>
<p>所有缓冲区类都不能用New关键字实例化，因为它们都是抽象类。</p>
</li>
<li>
<p>可以使用相应的静态工厂方法创建：static xxxBuff allocate(int capacity);</p>
</li>
</ol>
<h2>通道</h2>
<ol>
<li>
<p>基本概念：表示IO源与目标（例如：文件、套接字）打开的连接。但是通道（Channel）本身不能直接访问数据，需要与缓冲区（Buffer）配合才能实现数据的读取操作。</p>
</li>
<li>
<p>作用：负责传输数据</p>
</li>
<li>
<h3>通道的主要实现类</h3>
</li>
</ol>
<p><img src="td.png" alt="" /></p>
<h3>支持通道的类分为二种</h3>
<ol>
<li>
<p>用于本地IO操作：FileInputStream、FileOutputStream、RandomAccessFile</p>
</li>
<li>
<p>用于网络IO操作：DatagramSocket、Socket、ServerSocket</p>
</li>
</ol>
<h3>获取通道有三种方式</h3>
<ol>
<li>
<p>getChannel()方法</p>
</li>
<li>
<p>通过Files类的静态方法newByteChannel()获取</p>
</li>
<li>
<p>通过通道的静态方法：open()获取</p>
</li>
</ol>
<h2>选择器</h2>
<ol>
<li>基本概念：是可选择通道（SelectableChannel）对象的多路复用器，Selector可以同时监控多个SelectableChannel的IO状况，提供了询问通道是否已经准备好执行每个I/O操作的能力，即利用Selector可以使一个单独的线程管理多个Channel，这样会大量的减少线程之间上下文切换的开销</li>
</ol>
<h2>什么是线程上下文切换？</h2>
<ol>
<li>CPU在给线程分配时间时，有时由于时间片少，导致当前线程可能没有执行完，CPU会对该线程当前状态进行保存，当该线程再次得到时间片时，CPU可以根据保存的状态继续执行该线程，从线程保存到再次加载执行的过程就是一次上下文切换。</li>
</ol>
<h3>可选择通道(SelectableChannel)和选择键(SelectionKey)</h3>
<ol>
<li>
<p>SelectableChannel这个抽象类提供了实现通道的可选择性所需要的公共方法。它是所有支持就绪检查的通道类的父类。因为FileChannel类没有继承SelectableChannel因此是不是可选通道，而所有socket通道都是可选择的，包括从管道(Pipe)对象的中获得的通道。SelectableChannel可以被注册到Selector对象上，同时可以指定对那个选择器而言，那种操作是感兴趣的。一个通道可以被注册到多个选择器上，但对每个选择器而言只能被注册一次。</p>
</li>
<li>
<p>表示SelectableChannel和Selector之间的注册关系。每次像选择器注册通道时就会选择一个事件（选择键）。选择键包含两个数值的操作集，指示了该注册关系所关心的通道操作，以及通道已经准备好的操作。</p>
</li>
</ol>
<p><img src="xzq.png" alt="" /></p>
<h2>Register()中的二个参数</h2>
<ol>
<li>
<p>第一个参数：selector表示选择注册到那个选择器中</p>
</li>
<li>
<p>第二个参数：选择器键,给通道绑定监听事件，当一个通道需要绑定多个事件时，可以使用位或“|”操作符连接。</p>
</li>
<li>
<p>当通道不在需要某个选择键时，可以通过remove()方法取消绑定.</p>
</li>
</ol>
<p><img src="xzqj.png" alt="" /></p>
<h1>如果大家想更加深入的了解java.nio,可以自行去以下网站进行阅读</h1>
<h2>https://blog.csdn.net/pcwl1206/article/details/82996973</h2>
</div>
      </div>
    </div>
    <div class="col-2">
      <div class="container bg-white mt-5 mb-3 ">
        <h4 class="font-weight-normal pt-3  mb-3 text-center ">最新文章</h4>
        <div class="list-group list-group-flush pb-3 ">
          <a class="list-group-item text-dark" 
             href="../JavaApi/NioPackage.html">java.nio软件包 </a><a class="list-group-item text-dark" 
             href="../nio/nio.html">NIO的核心实现那些事儿！</a><a class="list-group-item text-dark" 
             href="../Study/Study_MarkDown.html">复习Markdown组件</a><a class="list-group-item text-dark" 
             href="../Anime/summer.html">夏季青春校园类</a><a class="list-group-item text-dark" 
             href="../hololive/Kagura.html">神楽Mea_Official</a><a class="list-group-item text-dark" 
             href="../hololive/aqu.html">湊-阿库娅Official</a>
          
          
          
          
          
          
          
          
          
          
        </div>
      </div>
    </div>
  </div>

</div>
<!--底部-->
<footer class="container-fluid  bg-light mt-1 py-3 text-center font-weight-light"> 
	达内教育-Java教研部 版权所有
</footer>

</body>
</html>